"""
加密模块：hashlib，不可逆
"""
import base64
import hashlib
import logging
import os
import random
import time
from functools import reduce

#hashlib常用加密方法,返回hash对象
hash_obj = hashlib.md5(b' hello')
hashlib.sha1(b' hello')
hashlib.sha256(b' hello')
hashlib.sha512(b' hello')
print(hash_obj.hexdigest()) #生成加密字符串

#案例：
base_sign = 'winner'
def custom():
    a_timestamp = int(time.time())
    _token = '%s%s' % (base_sign, a_timestamp)
    hashobj = hashlib.sha1(_token.encode('utf-8'))
    a_token = hashobj.hexdigest()
    return a_token, a_timestamp

def b_service_check(token, timestamp):
    _token = '%s%s' % (base_sign, timestamp)
    b_token = hashlib.sha1(_token.encode('utf-8')).hexdigest()
    if token == b_token:
        return True
    else:
        return False


if __name__ == '__main__':
    need_help_token, timestamp = custom()
    time.sleep(1)
    result = b_service_check(need_help_token, int(time.time()))
    if result == True:
        print('a合法，b服务可以进行帮助')
    else:
        print('a不合法，b不可进行帮助')

"""
base64包，编程语言通用，可解密
"""

#base64包常用方法
print(base64.encodebytes(b'hello')) #加密
print(base64.decodebytes(b'aGVsbG8=\n')) #解密 返回 b'hello'
print(base64.decodebytes(b'aGVsbG8=\n').decode('utf-8')) #bytes类型转成str类型

"""
logging模块
"""
#日志的等级：debug info warnning error critical

def init_log(path):
    if os.path.exists(path):
        mode = 'a'
    else:
        mode = 'w'
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s %(filename)s %(lineno)d %(levelname)s %(message)s',
        filename=path,
        filemode=mode,
        encoding='utf-8'
    )
    return logging

current_path = os.getcwd()
path = os.path.join(current_path, 'back.log')
log = init_log(path)

log.info('这是第一个记录的日志信息')
log.warning('这是一个警告')
log.error('这是一个重大的错误信息')
log.debug('这是一个debug')

"""
虚拟环境工具
"""

#Virtualenv
#pip install virtualenv
#virtualenv -p python3.6 env3.6   创建虚拟环境
#deactivate 退出虚拟环境

#pyenv

#常用函数
r1 = abs(-10) #返回绝对值
r2 = all(['a' in 'abc',True,None]) #全True才返回True
r3 = any(['a' in 'abc',True,None]) #有一个True就返回True
print(r1, r2, r3)

list_test = ['django','flask','winner'] #遍历list时获取索引
for index,item in enumerate(list_test):
    print(index,item)

class Test(object):
    a = 1
    b = 'a'
    def __init__(self, a, b):
        self.a = a
        self.b = b

test = Test(a=1, b='b')
r4 = vars(test) #把对象的属性传到字典里
r5 = hasattr(test, 'a') #判断是否有对应属性
setattr(test, 'f', '123') #把属性设置到对象里
r6 = vars(test)
print(r4, r5, r6)

if hasattr(list,'appends'):
    print(getattr(list,'appends'))
else:
    print('list不存在appends')

"""
random模块
"""

#随机返回0-1之间的浮点数
print(random.random())

#产生一个a、b区间的随机浮点数
print(random.uniform(10,20))

#产生一个a，b区间的随机整数
print(random.randint(1,10))

#返回对象中的一个随机元素
print(random.choice(['a','b','c']))
print(random.choice((1,2,3)))
print(random.choice('abc'))

#随机返回对象中指定数量的元素,返回的是列表
print(random.sample([1,2,3,4],2))
print(random.sample('abcd',3))

#获取区间内的一个随机数,以下两个等价
print(random.randrange(0,100,1))
print(random.choice(range(0,100,1)))

"""
迭代器，数据边用边加载到内存
"""

#生成一个迭代器对象,传入可迭代的数据类型iterable
iter_obj = iter([1,2,3,4])

#返回迭代器中的数据
print(next(iter_obj))
print(next(iter_obj))
print(next(iter_obj))


#for循环生成迭代器-yield
def test():
    for i in range(10):
        yield i
t = test()
print(next(t)) #0
print(next(t)) #1

#for循环一行生成迭代器
res = (i for i in [1,2,3])
print(res) #<generator object <genexpr> at 0x00000218D8AA1E40>
print(list(res)) #将迭代器对象转成列表
for i in res: #可以用for循环迭代迭代器对象
    print('==',i)
print('==========')
for i in res: #再次循环打印不出数据，数据被读取后，内存会释放数据
    print(i)

"""
高级函数（魔法函数）
"""

#filter：对循环根据过滤条件进行过滤,第一个参数是函数，第二个参数是需要过滤的列表
res = filter(lambda x: x>1,[0,1,2,3])
print(res) #<filter object at 0x00000124BB798A60>
print('filter=========================')
# print(list(res)) #可以直接转成列表,加了这一行，下面2个for循环都打印不出数据了
for i in res:
    print('-------',i)
for i in res: #打印不出数据，res是一个迭代器对象
    print('-------',i)
print('filter=========================')


#map 对列表中的每个成员依次执行函数，将执行结果放到新list中，返回map对象
res = map(lambda x: x>1,[0,1,2,3])
for i in res: #返回False False True True
    print(i)

#reduce 对循环中的前后两个数据进行累加等操作,返回的不是迭代器
res = reduce(lambda x,y:x+y,[1,2,3,4,5,6,7,8,9,10])
print(res) #55